草庐IT

C++ sizeof 包装类

全部标签

c++ - sizeof(空结构)和 sizeof(带有空数组的结构)之间的区别?

我有两个结构体定义如下:structEmptyStruct{};structStructEmptyArr{intarr[0];};intmain(void){printf("sizeof(EmptyStruct)=%ld\n",sizeof(EmptyStruct));printf("sizeof(StructEmptyArr)=%ld\n",sizeof(StructEmptyArr));return0;}在Ubuntu14.04、x64上使用gcc(g++)4.8.4编译。输出(对于gcc和g++):sizeof(EmptyStruct)=1sizeof(StructEmptyAr

c++ - 是否 sizeof(T) == sizeof(const T) 和 alignof(T) == alignof(const T)

假设T和constT是两种大小相同且对齐方式相同的类型似乎是合理的,但在考虑了一些实际系统之后,似乎它们可能会有所不同。让我解释一下:假设您的系统具有两种类型的内存:RAM和闪存(只读)。RAM是8位可寻址的,而Flash只能是16位可寻址的。假设这是T:structT{uint8_tx;uint16_ty;};在字节可寻址RAM中,该结构体的长度为3个字节......但在双字节可寻址闪存(const变量所在的位置)中,该结构体必须位于由于对齐问题,至少4个字节长。所以这是我的问题:c和c++标准是否保证const和非const类型的大小和对齐方式? 最佳答

c++ - 指向无效内存时 sizeof(*ptr) 的行为是否未定义?

我们都知道取消引用空指针或指向未分配内存的指针会调用未定义的行为。但是在传递给sizeof的表达式中使用时的规则是什么?例如:int*ptr=0;intsize=sizeof(*ptr);这也是未定义的吗? 最佳答案 在大多数情况下,您会发现sizeof(*x)实际上根本不计算*x。而且,由于它是调用未定义行为的指针的求值(取消引用),您会发现它基本上没问题。C11标准在6.5.3.4中有这样的说法。sizeof运算符/2(我在所有这些引号中强调):Thesizeofoperatoryieldsthesize(inbytes)ofi

c++ - sizeof 运算符的返回类型是什么?

sizeof运算符的返回类型是什么?cppreference.com&msdn说sizeof返回size_t。它真的返回size_t吗?我正在使用VS2010Professional,并针对x64。intmain(){intsize=sizeof(int);//Nowarningintlength=strlen("Expo");//warningC4267:'initializing':conversionfrom'size_t'to'int',possiblelossofdatareturn0;}我有这个问题是因为第一行没有发出任何警告,而第二行却发出了警告。即使我将其更改为char

C++ 安全 boolean 包装器

我正在尝试设计一个bool包装器结构应用safeboolidiom。解决这个问题的经典实现非常简单:骨架可能是这样的:structBoolfinal{Bool()=default;Bool(boolvalue):_value{value}{}explicitoperatorbool()const{return_value;}private:bool_value{false};};我要改进的部分是Bool的构造方式。例如,我想通过设计避免隐式缩小:Boolb1(45);//yieldswarnings,butitcompilesBoolb2{3};//notokbystandard我尝试

c++ - sizeof 和 alignof 有什么区别?

sizeof和alignof有什么区别?#include#defineSIZEOF_ALIGNOF(T)std::cout会输出1/11/12/22/24/44/44/44/44/48/88/88/8我想我不明白对齐是什么...? 最佳答案 嗯,“内存”基本上是一个巨大的字节数组。然而,像整数这样较大的东西需要超过1个字节来存储它们——例如,一个32位的值将使用4个连续字节的内存。现在,您计算机中的内存模块通常不是“字节”;它们也以“并行”的几个字节组织,例如4个字节的block。对于CPU,在读取诸如整数之类的内容时,不“跨越”此

c# - 创建简单的 c++.net 包装器。一步步

我有一个C++项目。我承认我在C++中完全是零。但是我仍然需要编写一个c++.net包装器,这样我就可以使用它来处理一个非托管c++库。所以我有什么:1)非托管项目的头文件。2)非托管项目的库(.dll和.lib)3)一个空的C++.NET项目,我计划将其用作我的c#应用程序的包装器我该如何开始?我什至不知道如何设置对非托管库的引用。求救 最佳答案 http://www.codeproject.com/KB/mcpp/quickcppcli.aspx#A8这是大方向。您需要创建C++/CLI类库项目,向其中添加.NET类(本示例中的

c++ - Sizeof 字符串字面量

以下代码#includeusingnamespacestd;intmain(){constchar*constfoo="f";constcharbar[]="b";cout输出sizeof(stringliteral)=2sizeof(constchar*const)=4sizeof(constchar[])=2在32位操作系统上,使用GCC编译。sizeof为什么要计算字符串字面量(所需空间)的长度?当给sizeof时,字符串文字是否具有不同的类型(来自char*或char[])? 最佳答案 sizeof("f")必须返回2,一个

c++ - 如何包装具有可变长度参数的函数?

我希望在C/C++中执行此操作。我遇到了VariableLengthArguments,但这建议使用Python和C的解决方案libffi.现在,如果我想用myprintf包装printf函数。我这样做如下:voidmyprintf(char*fmt,...){va_listargs;va_start(args,fmt);printf(fmt,args);va_end(args);}int_tmain(intargc,_TCHAR*argv[]){inta=9;intb=10;charv='C';myprintf("Thisisanumber:%dand\nthisisacharact

c++ - sizeof(void()) 是合法的表达式吗?

来自[5.3.3/1],我发现:The sizeof operatorshallnotbeappliedtoanexpressionthathasfunctionorincompletetype来自[3.9/5]我发现:Incompletely-definedobjecttypesand cvvoid are incompletetypes无论如何,对于sizeof不评估它的操作数,我会说sizeof(void())是一个合法的表达式(实际上是GCC编译它和结果是1)。另一边,来自here,在讨论sizeof时没有提到void,既没有提到大小为1的类型,也没有在具有实现定义的列表中大小